package JeuInterfaces;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import GameBoard.GameBoard;
import GameElements.Tile;
import Player.Player;


public abstract class JeuInterfaceGraphiqueAbstract implements Runnable, MouseListener {

	protected int clickX;
	protected int clickY;
	protected JPanel TuilesOptionsPanel;
	private JPanel JoueursOptionsPanel;
	protected Tile tuileCourante;
	protected JLabel label;
	protected boolean tuilePose;
	protected boolean pionPose;
	protected int tuileSize;
	
	/* Champs recuperes dans le constructeur */
	public GameBoard gameBoard;
	public Vector<Player> listeDesJoueurs;
	private String version;

	protected JFrame window;
	protected JPanel gamePanel;
	protected JPanel optionsPanel;

	private JScrollPane jscroll;
	private JButton terminerTour, tournerTuiler;

	/* champs pour optionsPanel */
	private int nombreJoueurs;

	private JLabel[] labelPions;
	private JLabel[] labelPoints;

	
	
	public JeuInterfaceGraphiqueAbstract(Vector<Player> joueursH,String versionJeu) {
		this.version = versionJeu;
		this.pionPose = false;
		this.tuilePose = false;
		nombreJoueurs = joueursH.size();
		labelPions = new JLabel[nombreJoueurs];
		labelPoints= new JLabel[nombreJoueurs];
		clickX = clickY = 0;
		listeDesJoueurs = joueursH;
		System.out.println("taille vect : " + listeDesJoueurs.size());

	}

	@Override
	public void run() {
		initWindow();
		initOptionsPanel();
		initGamePanel();
		includes();
		jscroll.getVerticalScrollBar().setValue(tuileSize * ((this.gameBoard.getWidthGrille()-1)/2) - 400);
		jscroll.getHorizontalScrollBar().setValue(tuileSize * ((this.gameBoard.getWidthGrille()-1)/2) - 400);
		window.setVisible(true);
		miseAJourGrille();
		update();
	}

	private void initWindow() {
		window = new JFrame("Carcassone"); /* si setSize() enlever pack() */
		int largeur = (int) (java.awt.Toolkit.getDefaultToolkit().getScreenSize().getWidth());
		int hauteur = (int) java.awt.Toolkit.getDefaultToolkit().getScreenSize().getHeight() - 90;
		window.setPreferredSize(new Dimension(largeur, hauteur));
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}

	private void initGamePanel() {
		gamePanel = new JPanel(null);
		gamePanel.setPreferredSize(new Dimension(tuileSize * this.gameBoard.getWidthGrille(), tuileSize * this.gameBoard.getHeightGrille()));
		gamePanel.addMouseListener(this);
		jscroll = new JScrollPane(gamePanel);
		jscroll.setAutoscrolls(true);
		jscroll.setVisible(true);
	}

	private void initOptionsPanel() {
		optionsPanel = new JPanel();
		int largeur = (int) (java.awt.Toolkit.getDefaultToolkit()
				.getScreenSize().getWidth() * 0.2 - 10);
		int hauteur = (int) java.awt.Toolkit.getDefaultToolkit()
				.getScreenSize().getHeight() - 100;
		Dimension panelOptionDimension = new Dimension(largeur, hauteur);
		optionsPanel.setPreferredSize(panelOptionDimension);
		terminerTour = new JButton("Terminer le tour");
		tournerTuiler = new JButton("Tourner l'image");
		optionsPanel.setLayout(new GridLayout(2, 1));
		TuilesOptionsPanel = new JPanel();
		JoueursOptionsPanel = new JPanel();
		TuilesOptionsPanel.setBorder(BorderFactory
				.createTitledBorder("Prochaine tuile"));
		JoueursOptionsPanel.setBorder(BorderFactory
				.createTitledBorder("Points des joueurs"));
		TuilesOptionsPanel.setLayout(new BorderLayout());
		JoueursOptionsPanel.setLayout(new GridLayout(nombreJoueurs, 3));
		JScrollPane scrollpane = new JScrollPane(JoueursOptionsPanel);
		scrollpane.setAutoscrolls(true);
		scrollpane.setVisible(true);

		optionsPanel.add(TuilesOptionsPanel);
		optionsPanel.add(scrollpane);
		
		// couleur du joueur qui commence la partie
		TuilesOptionsPanel.setBackground(listeDesJoueurs.elementAt(0).getColor());

		// ajout des joueurs
		for (int i = 0; i < nombreJoueurs; i++) {	
			// ajout du nom
			JLabel labelNomJoueur = new JLabel(listeDesJoueurs.elementAt(i).getNom()+ " : ");
			labelNomJoueur.setBackground(listeDesJoueurs.elementAt(i).getColor());
			labelNomJoueur.setForeground(listeDesJoueurs.elementAt(i).getColor());
			JoueursOptionsPanel.add(labelNomJoueur);
			// ajout des pions
			int nombrePionsJoueur = listeDesJoueurs.elementAt(i).getPawn().size();
			labelPions[i] = new JLabel(nombrePionsJoueur+" pions");
			JoueursOptionsPanel.add(labelPions[i]);
			// ajout des points
			labelPoints[i] = new JLabel(listeDesJoueurs.elementAt(i).getPoint()+ " points");
			JoueursOptionsPanel.add(labelPoints[i]);
		}

		TuilesOptionsPanel.add(tournerTuiler, BorderLayout.NORTH);
		tournerTuiler.addActionListener(new TournerActionListener());
		terminerTour.addActionListener(new TermineTour());
		TuilesOptionsPanel.add(terminerTour, BorderLayout.SOUTH);

	}

	private void includes() {
		JMenuBar menu = new JMenuBar();
		JMenu fichier = new JMenu("Fichier");
		JMenuItem quitter = new JMenuItem("Quitter");
		quitter.addActionListener(new QuitterPartie());
		fichier.add(quitter);
		menu.add(fichier);

		window.getContentPane().add(optionsPanel, BorderLayout.WEST);
		window.getContentPane().add(jscroll, BorderLayout.CENTER);
		window.setJMenuBar(menu);
		window.setResizable(true);
		window.pack();

	}

	public void miseAJourGrille() {
		this.gamePanel.removeAll();
		for (int i = 0; i < gameBoard.getTable().length; i++) {
			for (int j = 0; j < gameBoard.getTable()[i].length; j++) {
				if (gameBoard.getTable()[i][j] != null) {
					JLabel l = new JLabel(new ImageIcon(gameBoard.getTable()[i][j]
							.getImage().getImage()));
					l.setPreferredSize(new Dimension(tuileSize, tuileSize));
					l.setBounds(i * tuileSize, j * tuileSize, tuileSize, tuileSize);

					if (i == clickY && j == clickX) {
						l.addMouseListener(new myMouseListener(
								gameBoard.getTable()[i][j]));
					}
					this.gamePanel.add(l);
				}
			}
		}
		for (int i = 0; i < listeDesJoueurs.size(); i++) {
			this.labelPions[i].setText(listeDesJoueurs.elementAt(i).getPawn().size()+" pion(s)");
			this.labelPoints[i].setText(listeDesJoueurs.elementAt(i).getPoint()+" point(s)");
		}
		gamePanel.repaint();
		gamePanel.validate();
	}

	class QuitterPartie implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent arg0) {
			// TODO Auto-generated method stub
			System.exit(0);
		}
	}

	@Override
	public void mouseClicked(MouseEvent arg0) {
		mouseClickedGamePanelAction(arg0);
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	class TournerActionListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent arg0) {
			buttonTournerAction(arg0);
		}
	}

	
	
	
	
	
	// LISTENER SUR LE LABEL
	class myMouseListener implements MouseListener {
		private Tile tuile;

		public myMouseListener(Tile t) {
			this.tuile = t;
		}

		@Override
		public void mouseClicked(MouseEvent e) {
			mouseClickedTuileAction(e, tuile);
		}

		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub

		}

		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub

		}

		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub

		}

		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub

		}

	}

	public static int positionTuile(int x, int y, int hauteur, int largeur) {
		int largeurPar3 = largeur / 3;
		int hauteurPar3 = hauteur / 3;
		double a = hauteur / largeur;

		if (x <= largeurPar3 && y <= hauteurPar3 && a * x <= y) {
			return 11;
		}
		if (x <= largeurPar3 && y <= hauteurPar3 && a * x > y) {
			return 0;
		}
		if (x <= 2 * largeurPar3 && y <= hauteurPar3) {
			return 1;
		}
		if (x <= largeur && y <= hauteurPar3 && -a * x + hauteur <= y) {
			return 3;
		}
		if (x <= largeur && y <= hauteurPar3 && -a * x + hauteur > y) {
			return 2;
		}
		if (x <= largeurPar3 && y <= 2 * hauteurPar3) {
			return 10;
		}
		if (x <= 2 * largeurPar3 && y <= 2 * hauteurPar3) {
			return 12;
		}
		if (x <= largeur && y <= 2 * hauteurPar3) {
			return 4;
		}
		if (x <= largeurPar3 && y <= hauteur && -a * x + hauteur <= y) {
			return 8;
		}
		if (x <= largeurPar3 && y <= hauteur && -a * x + hauteur > y) {
			return 9;
		}
		if (x <= 2 * largeurPar3 && y <= hauteur) {
			return 7;
		}
		if (x <= largeur && y <= hauteur && a * x <= y) {
			return 6;
		}
		return 5;
	}
	
	class TermineTour implements ActionListener{
		public void actionPerformed(ActionEvent arg0) {
			buttonTermineTourAction(arg0);
		}		
	}
	
	
	
	protected abstract void update();
	protected abstract void mouseClickedGamePanelAction(MouseEvent arg0);
	protected abstract void buttonTournerAction(ActionEvent arg0);
	protected abstract void mouseClickedTuileAction(MouseEvent e, Tile t);
	protected abstract void buttonTermineTourAction(ActionEvent arg0);

}
